/**
 * 另种操作：
 * 1 x：将2^x次方加入集合
 * 2 w: 问能否用集合里的数构成w
 * w显然由一系列的二进制位构成，而集合里面保存了可用的二进制位
 * 对w，从低到高匹配每一位i，因为集合中比i高的位肯定没用
 * 其次，对某一位i，它是直接用i位匹配，还是用比i小的位组合而来，对以后的结果并无影响
 * 因此匹配第i位时，做一个深搜即可
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = long double;
using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vvi = vector<vi>;

int Q;
int Cnt[30];
int Record[30];

void restore(){
    for(int i=0;i<30;++i) Cnt[i] += Record[i];
}

bool dfs(int pos, llt cur){
    if(-1 == pos){
        return 0 == cur;
    }

    if(Cnt[pos] >= cur){
        Cnt[pos] -= cur;
        Record[pos] += cur;
        return true;
    }

    Record[pos] += Cnt[pos];
    cur -= Cnt[pos];
    Cnt[pos] = 0;
    auto b = dfs(pos - 1, cur + cur);
    return b;
}

bool proc(int w){
    memset(Record, 0, sizeof(Record));
    bool ret = true;
    for(int i=0;i<31;++i){
        if((1 << i) & w){
            ret = dfs(i, 1);
            if(not ret) break;
        }
    }
    restore();
    return ret;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--){
        cin >> Q;
        for(int t,v,q=1;q<=Q;++q){
            cin >> t >> v;
            if(1 == t){
                ++Cnt[v];
            }else if(2 == t){
                cout << (proc(v) ? "YES" : "NO") << "\n";
            }else{
                // assert(0);
            }
        }
    }
    return 0;
}